package web

import (
	"github.com/gorilla/websocket"
	"sync"
)

//盐
const solt = "0x1990"

// WsClientManager is a websocket manager
type WsClientManager struct {
	Clients sync.Map
	//roomsid 为 appid/roomid
	Rooms      sync.Map
	Broadcast  chan []byte
	Register   chan *WsClient
	Unregister chan *WsClient
}

// WsClient is a websocket client
type WsClient struct {
	ID       string
	IDSecret string
	connID   string
	label    string
	Socket   *websocket.Conn
	Send     chan []byte
}

type WsRoom struct {
	//id，name
	Clients sync.Map
}

// WsMessage is an object for websocket message which is mapped to json type
// Appid和Roomid   或 Recipient
// 如果有Appid和Roomid，则是群聊消息，如果有Recipient，则为1V1私聊消息[优先]
// 如果没有Appid和Roomid，也没有Recipient，则回复消息发送失败
type WsMessage struct {
	Code  int    `json:"code,omitempty"`
	MsgId string `json:"msgid,omitempty"`
	//应用id，可以为空
	Appid string `json:"appid,omitempty"`
	//房间号，可以为空
	Roomid string `json:"roomid,omitempty"`
	Cbk    string `json:"cbk,omitempty"`
	//发送者id，system为系统，其余为uuid值,不能为空
	Sender string `json:"sender"`
	//接受者id，空则广播给所有该appid内的，二选一，要么有Appid和Roomid，要么有Recipient，否则消息会失败。
	//其中接收者system，提供了加入appid和roomid
	Recipient string `json:"recipient,omitempty"`
	//消息时间
	UserTime    int64 `json:"usertime,omitempty"`
	SysTime     int64 `json:"systime,omitempty"`
	SysTimeNano int64 `json:"systimenano,omitempty"`

	//内容，如果recipient为system，则content需要解析为WsSystemMessage
	Content interface{} `json:"content,omitempty"`
}

type WsSystemMessageContent struct {
	//发送给system的消息，主要用于加入room和退出room，可扩展其他用途

	//in 加入房间，out 退出房间
	Ctype string `json:"ctype,omitempty"`

	Appid  string `json:"appid,omitempty"`
	Roomid string `json:"roomid,omitempty"`

	//扩展参数
	Param1 string `json:"param1,omitempty"`
	Param2 string `json:"param2,omitempty"`
}

type WsSystemMessage struct {
	Code int `json:"code,omitempty"`
	//应用id，可以为空
	Appid string `json:"appid,omitempty"`

	//房间号，可以为空
	Roomid string `json:"roomid,omitempty"`

	//发送者id，system为系统，其余为uuid值,不能为空
	Sender string `json:"sender"`

	//接受者id，空则广播给所有该appid内的，二选一，要么有Appid和Roomid，要么有Recipient，否则消息会失败。
	//其中接收者system，提供了加入appid和roomid
	Recipient string `json:"recipient,omitempty"`

	//消息时间
	Time int64  `json:"time,omitempty"`
	Cbk  string `json:"cbk,omitempty"`

	//内容，如果recipient为system，则content需要解析为WsSystemMessage
	Content WsSystemMessageContent `json:"content,omitempty"`
}

type replyMsg struct {
	Code   int         `json:"code,omitempty"`
	Cbk    string      `json:"cbk,omitempty"`
	Status string      `json:"status,omitempty"`
	Msg    string      `json:"msg,omitempty"`
	Data1  interface{} `json:"data1,omitempty"`
	Data2  interface{} `json:"data2,omitempty"`
	Data3  interface{} `json:"data3,omitempty"`
	Data4  interface{} `json:"data4,omitempty"`
	Data5  interface{} `json:"data5,omitempty"`
}
